
/**
 * Crea una instancia de una lista de etapas.
 *
 * @constructor
 * @this {ListaEN}
 * @param {string} parentId El valor del tag 'id' del elemento HTML que va a contener la lista.
 */
function ListaEN(parentId)
	{
	this.parentId = parentId;
	this.etapas = new Array();
	
	this.fechaInicio = null;
	this.fechaFin = null;
	this.capacidad = 0;
	this.cambio = false;
	}

/**
 * Establece las etapas de la lista. 
 * Cada objeto de la lista debe tener definidas las propiedades: 'formatoId', 'formato', 'proporcion' y 'orden'.
 * 
 * @this {ListaEN}
 * @param {Array} stages Las etapas de la lista.
 */
ListaEN.prototype.setEtapas = function(stages)
	{
	this.etapas = stages;
	this.etapas.sort(function(et1, et2)
		{
		if(et1['orden'] > et2['orden']) return 1;
		if(et1['orden'] < et2['orden']) return -1;
		return 0;
		});
	};
	
/**
 * Devuelve las etapas de la lista.
 *
 * @this {ListaEN}
 * @return {Array} Las etapas de la lista.
 */
ListaEN.prototype.getEtapas = function()
	{return this.etapas;};

/**
 * Establece la fecha de inicio del ciclo al que pertenecen las órdenes.
 * 
 * @this {ListaEN}
 * @param {Date} startDate La fecha de inicio.
 */
ListaEN.prototype.setFechaInicio = function(startDate)
	{this.fechaInicio = startDate;};
	

/**
 * Establece la fecha de fin del ciclo al que pertenecen las órdenes.
 * 
 * @this {ListaEN}
 * @param {Date} endDate La fecha de fin.
 */
ListaEN.prototype.setFechaFin = function(endDate)
	{this.fechaFin = endDate;};
	

/**
 * Establece la capacidad del ciclo al que pertenecen las órdenes.
 * 
 * @this {ListaEN}
 * @param {number} capacity La capacidad.
 */
ListaEN.prototype.setCapacidad = function(capacity)
	{this.capacidad = capacity;};
	
/**
 * Devuelve un booleano indicando si se realizaron cambios en el orden de la lista.
 * 
 * @this {ListaEN}
 * @return {boolean} 'true' si se realizó un cambio o 'false' en caso contrario.
 */
ListaEN.prototype.huboCambios = function()
	{ return this.cambio; };
	
/**
 * Devuelve la lista de los id's de las etapas, en un string, separados por una coma.
 *
 * @this {ListaEN}
 * @return {String} La lista de id's.
 */
ListaEN.prototype.getIds = function()
	{
	// Normalizo el valor de las proporciones (de manera que la suma de 100)
	var total = 0;
	var proporciones = new Array();
	jQuery("#" + this.parentId + " ul li.etapa").each(function(index)
		{
		proporciones[index] = new Object();
		proporciones[index]['formatoId'] = jQuery(this).attr("data-formatoId");
		proporciones[index]['proporcion'] = parseFloat(jQuery(this).find("input").val().replace(',','.'));
		total += proporciones[index]['proporcion'];
		});

	var res = '';
	for(var i=0; i<proporciones.length; i++)
		{
		if(res.length > 0) res += ',';
		res += proporciones[i]['formatoId'] + ":" + (proporciones[i]['proporcion']*100/total) + ":" + i;
		}
	return res;
	};

/**
 * Genera el código Html de la lista, lo inserta en la página y le asigna los comportamientos.
 *
 * @this {ListaEN}
 */
ListaEN.prototype.insertarHtml = function()
	{
	// Genero y inserto el código Html.
	var html = this.generarHtml();
	jQuery("#" + this.parentId).children().remove();
	jQuery("#" + this.parentId).append(html);

	// Asigno los comportamientos y calculo las fechas.
	this.asignarComportamientos();
	this.calcularFechasYCantidades();
	};

/**
 * Genera el código Html de la lista.
 *
 * @private
 * @this {ListaEN}
 * @return {string} El código Html
 */
ListaEN.prototype.generarHtml = function()
	{
	var o, html = '<ul class="etapas">';
	
	for(o=0; o<this.etapas.length; o++)
		{
		html += '<li class="etapa" data-formatoId="' + this.etapas[o].formatoId + '" >';
		html += '<span class="identificador">' + this.etapas[o].formato + '</span>';
		html += ' - <input type="text" name="etapa_'+this.etapas[o].formatoId+'" size="4" value="'+parseFloat(this.etapas[o].proporcion)+'"/>';
		html += ' - <span class="info cantidad"></span>';
		html += ' - <span class="fechas"></span>';
		html += '</li>';
		}	
		
	html += '</ul>';			
	return html;
	};

/**
 * Asigna los eventos y comportamientos al código Html de la lista.
 *
 * @private
 * @this {ListaEN}
 */
ListaEN.prototype.asignarComportamientos = function()
	{
	var padreId = this.parentId;
	var lot = this;

	// Al mover un elemento o modificar su proporción, recalculo las fechas.
	jQuery("#" + padreId + " ul").sortable(
		{
		stop: function(event, ui)
			{
			// Recalculo las fechas.
			lot.calcularFechasYCantidades();
			
			// Establezco que hubo un cambio.
			lot.cambio = true;
			}
		});	
		
	jQuery("#" + padreId + " ul li input").change(function()
		{
		lot.calcularFechasYCantidades();
		lot.cambio = true;
		});
	};

/**
 * Calcular fechas y cantidad disponible.
 *
 * @this {ListaEN}
 */
ListaEN.prototype.calcularFechasYCantidades = function()
	{
	var fechaFinCiclo = this.fechaFin;
	var fechaInicioCiclo = this.fechaInicio;
	var capacidad = this.capacidad;
	
	// Obtengo la suma de proporciones.
	var total = 0;
	jQuery("#" + this.parentId + " ul li.etapa").each(function(index)
		{
		// Calculo la cantidad.
		var proporcion = jQuery(this).find("input").val();
		if(proporcion != null && proporcion.length > 0)
			{ total += parseFloat(proporcion.replace(',','.')); }
		});
		
	// Calculo las fechas y las cantidades;
	var acumulado = 0;
	var msXbolsa = (fechaFinCiclo - fechaInicioCiclo.getTime())/this.capacidad;
	var endDate, startDate = fechaInicioCiclo;
	jQuery("#" + this.parentId + " ul li.etapa").each(function(index)
		{
		// Calculo la cantidad.
		var proporcion = jQuery(this).find("input").val();
		if(proporcion == null || proporcion.length == 0) proporcion = 0; else proporcion = parseFloat(proporcion.replace(',','.'));
		var cantidad = parseInt(proporcion * capacidad / total, 10);

		var spanC = jQuery(this).find("span.cantidad");
		jQuery(spanC).children().remove();
		jQuery(spanC).append('<span>' + formatoNumero(cantidad) + '</span>');
		
		// Calculo las fechas.
		acumulado += cantidad;
		endDate = new Date(fechaInicioCiclo.getTime() + msXbolsa*acumulado);

		var spanF = jQuery(this).find("span.fechas");
		jQuery(spanF).children().remove();
		jQuery(spanF).append(
			'<span>' +
			 startDate.getDate() + '/' + (startDate.getMonth()+1) + '/' + startDate.getFullYear() + ' <span class="hora">' + startDate.getHours() + ':' + startDate.getMinutes() + '</span>' +
			' - ' +
			endDate.getDate() + '/' + (endDate.getMonth()+1) + '/' + endDate.getFullYear() + ' <span class="hora">' + endDate.getHours() + ':' + endDate.getMinutes() + '</span>' +
			'</span>'	
			);

		startDate = endDate;
		});	
	};

